home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 April: Mac OS SDK / Dev.CD Apr 97 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAEGetDataSize.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  3.8 KB  |  154 lines  |  [TEXT/CWIE]

  1. // SVAEGetDataSize.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAEGetDataSize.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10.  
  11. // -----------------------------------------------------------------------
  12. //        Name:             DoGetDataSize
  13. //        Purpose:        Handles the GetDataSize AppleEvent.
  14. // -----------------------------------------------------------------------
  15.  
  16. pascal OSErr    DoGetDataSize(const AppleEvent    *theAppleEvent,
  17.                                     AppleEvent    *reply,
  18.                                     long        handlerRefCon)
  19. #pragma unused (handlerRefCon)
  20.  
  21.     AEDesc        directObj = {typeNull, NULL},
  22.                 result = {typeNull, NULL};
  23.     Size          actualSize;
  24.     DescType      returnedType;
  25.     DescType      reqType;
  26.     OSErr         err;
  27.     
  28.         // pick up the direct object, which is the object whose data is to be sized
  29.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  30.         
  31.         // now the get the type wanted - optional
  32.     reqType = typeChar;    // Default to char
  33.     (void)AEGetParamPtr(theAppleEvent, keyAERequestedType, typeType, &returnedType,
  34.                                                 (Ptr)&reqType, sizeof(reqType), &actualSize);
  35.         
  36.     err = GotRequiredParams(theAppleEvent);
  37.     if (noErr != err) goto done;
  38.     
  39.     if (typeNull != directObj.descriptorType)
  40.         err = GetDataSizeDesc(&directObj, reqType, &result);
  41.     else
  42.         err = errAENoSuchObject;
  43.         
  44.     err = AddResultToReply(&result, reply, err);
  45.  
  46. done:    
  47.     if (directObj.dataHandle) 
  48.         AEDisposeDesc(&directObj);
  49.     if (result.dataHandle) 
  50.         AEDisposeDesc(&result);
  51.             
  52.     return(err);
  53. } // DoGetDataSize
  54.  
  55.  
  56. OSErr    GetDataSizeTextToken(TextToken* theToken, AEDesc* result)
  57. {
  58.     long    aSize;
  59.     OSErr    err;
  60.     
  61.     aSize = theToken->tokenLength;
  62.     
  63.     err = AECreateDesc(typeLongInteger, (Ptr)&aSize, sizeof(aSize), result);
  64.  
  65.     return(err);
  66. }
  67.  
  68. OSErr    GetDataSizeTextDesc(AEDesc* textDesc, AEDesc* result)
  69. {
  70.     TextToken        aTextToken;
  71.     Size            actualSize;
  72.     OSErr            err;
  73.  
  74.     if (typeMyText != textDesc->descriptorType)
  75.         return(errAETypeError);
  76.         
  77.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  78.  
  79.     err = GetDataSizeTextToken(&aTextToken, result);
  80.     
  81.     return(err);
  82. }
  83.  
  84. OSErr    GetDataSizeDesc(AEDesc* aDesc, DescType reqType, AEDesc* result)
  85. {
  86.     AEDesc        dataSizeDesc = {typeNull, NULL},
  87.                 textDesc = {typeNull, NULL},
  88.                 itemDesc = {typeNull, NULL},
  89.                 itemResult = {typeNull, NULL};
  90.     long        itemCount,
  91.                 index;
  92.     DescType    theAEKeyword;
  93.     OSErr        err;
  94.     
  95.     if (typeObjectSpecifier == aDesc->descriptorType)
  96.         err = AEResolve(aDesc, kAEIDoMinimum, &dataSizeDesc);
  97.     else
  98.         err = AEDuplicateDesc(aDesc, &dataSizeDesc);
  99.         
  100.     if (noErr != err) goto done;
  101.     
  102.     if (typeAEList == dataSizeDesc.descriptorType)
  103.     {
  104.         err = AECreateList(NULL, 0 , false, result);    // Result will also be a list of items
  105.         if (noErr != err) goto done;
  106.         err = AECountItems(&dataSizeDesc, &itemCount);
  107.         if (noErr != err) goto done;
  108.         
  109.         for (index = 1; index <= itemCount; index++)
  110.         {
  111.             err = AEGetNthDesc(&dataSizeDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  112.             if (noErr != err) goto done;
  113.             
  114.             err = GetDataSizeDesc(&itemDesc, reqType, &itemResult);    // Call recursively
  115.             if (noErr != err) goto done;
  116.             
  117.             err = AEPutDesc(result, 0, &itemResult);    // Add to our result list
  118.             if (noErr != err) goto done;
  119.  
  120.             if (itemDesc.dataHandle)
  121.                 AEDisposeDesc(&itemDesc);
  122.             if (itemResult.dataHandle)
  123.                 AEDisposeDesc(&itemResult);
  124.         }
  125.     }
  126.     else
  127.     {
  128.         switch (reqType)
  129.         {
  130.             case typeChar:
  131.                 err = AECoerceDesc(&dataSizeDesc, typeMyText, &textDesc);
  132.                 if (noErr != err) goto done;
  133.                 err = GetDataSizeTextDesc(&textDesc, result);
  134.                 break;
  135.                 
  136.             default:
  137.                 err = errAECantSupplyType;
  138.         }
  139.     }
  140.     
  141. done:
  142.     if (dataSizeDesc.dataHandle)
  143.         AEDisposeDesc(&dataSizeDesc);
  144.     if (textDesc.dataHandle)
  145.         AEDisposeDesc(&textDesc);
  146.     if (itemDesc.dataHandle)
  147.         AEDisposeDesc(&itemDesc);
  148.     if (itemResult.dataHandle)
  149.         AEDisposeDesc(&itemResult);
  150.     
  151.     return(err);
  152. }
  153.